class Solution {
    public void nextPermutation(int[] nums) {
        //组合出下一个更大的数
        // 123 - 132 ;321最大 则变最小的数123；
        
        int len = nums.length;
        if(len <= 1 ) return;

        //倒数第二个的位置
        int i = len-2 ;
        //从后往前找到的一个非升序的,i
        while ( i >= 0 && nums[i] >= nums[i+1] ) i--;
        //说明当前是最大的数
        if( i < 0){
            //直接返回最小的数
            asc(nums, 0, len-1);
        }else{
            //找到第一个比这个数大的元素j
            int j = len-1 ;
            while ( i < j  && nums[j] <= nums[i] ) j--;
            //交换这两个的位置，
            swap(nums,i,j);
            //并且让i后面的元素，按照升序排序；
            asc(nums, i+1 ,len-1);
        }
    }
    public void swap(int[] nums,int i,int j){
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
    public void asc(int[] nums,int i,int j){
        while( i <= j ){
            swap(nums,i,j);
            i++;
            j--;
        }
    }
}